﻿#ifndef TUCAMWIDGET_H
#define TUCAMWIDGET_H
#pragma execution_character_set("utf-8") //防止中文乱码

#include "CameraManager.h"
#include "CameraWorker.h"
#include "TUCamApi.h"
//opencv
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>


//摄像头
#include <QCameraImageCapture>
#include <QCamera>

#include <QWidget>
#include <QDebug>
#include <QTimer>
#include <QThread>
#include <QPoint>
#include <QRect>
#include <QList>
#include <QButtonGroup>
#include <QFileDialog>
#include <QDateTime>

//读取文件
#include <QPixmap>
#include <QLabel>
//open窗口
#include "open.h"   //子窗口头文件



QT_BEGIN_NAMESPACE
namespace Ui { class TucamWidget; }
QT_END_NAMESPACE

class TucamWidget : public QWidget
{
    Q_OBJECT

public:
    TucamWidget(QWidget *parent = nullptr);
    ~TucamWidget();
signals:

    void stopCameraWorker();   // 通知工作线程停止的信号
    void StratTread();         //线程开始
    void startCapture();

    //裁剪
    void cropCompleted(const QPixmap &croppedImage);//裁剪信号
    void cropCanceled();

private slots:


    void on_colseCamera_clicked();      //关闭摄像头

    void opencam();          //打开摄像头

    void on_pushButton_clicked();       //获取属性信息

    void on_pushButton_4_clicked();     //获取性能信息

    void on_stopcap_clicked();           //停止线程

    void initialize();        //初始化设备信息


    void updateLabel(const TUCAM_FRAME& frame);//预览显示

    void btn_preView();          //打开预览

    void on_ATEXPOSURE_check_stateChanged(int state); //自动曝光


     void UpdateExposureTimeSpinbox(DWORD dwExp);  //更新曝光
     void UpdateExposureTimeSliderbox(DWORD dwExp);

    void on_sec_spinBox_valueChanged(int arg1);

    void on_Slider_exposure_valueChanged(int value);
    void initalSlider();

    void on_comboBox_currentIndexChanged(int index);


    void on_temperature_spinBox_valueChanged(int arg1);

    void on_ms_spinBox_valueChanged(int arg1);

    //void on_uSec_spinBox_textChanged(int arg1);//微妙不要了，后续如果需要可以使用，ui删掉了注意
    void currentTemperature();
    void currentExposureTime();

    void on_ROI_pre_selected(bool checked);    // ROI_pre_btn 被选中时触发的槽
    void on_ROI_manual_selected(bool checked); // ROI_manual_btn 被选中时触发的槽
    void on_ROI_set_btn_clicked();             // 设置ROI
    void on_select_file_btn_clicked();         // 选择图片保存路径

    void on_capture_btn_clicked();             //拍照


    void on_ATFOCUS_check__stateChanged(int arg1);  //初级的自动对焦，还需要改

    void on_openfile_clicked();

    void on_image_flip_horizontal_clicked();//左右翻转

    void on_image_flip_vertically_clicked();
    //以下为进行图片裁剪所需要的函数
    void activate();                  //激活函数
    void mousePressEvent(QMouseEvent *event);   //鼠标事件（当鼠标点击时）
    void mouseMoveEvent(QMouseEvent *event);   //鼠标事件（当鼠标移动时）
    void mouseReleaseEvent(QMouseEvent *event); //鼠标事件（当鼠标松开时）
    void paintEvent(QPaintEvent *event);
    void keyPressEvent(QKeyEvent *event);   //通过esc来实现退出截屏
    QRect getImageDisplayArea() const ;
    QRect convertToImageRect(const QRect &screenRect) const;  //将屏幕坐标系中的矩形区域转换为图像坐标系中的矩形区域
    void handleCropCompleted(const QPixmap &cropped);//接受开始裁剪的槽函数
    void handleCropCanceled();
    void on_image_cut_clicked();

    void on_image_normal_rotate_clicked();//顺时针旋转90

    void on_image_anti_rotate_clicked();//逆时针旋转90

    void on_image_inverted_clicked();//颜色翻转

    void on_image_brightness_slider_valueChanged(int value);//通过控件改变图片亮度
    QImage lightContrastImage(const QImage &img,  int light, float Contrast); //改变图片亮度和对比度函数

    void on_image_brightness_valueChanged(int arg1);

    void on_image_contrast_slider_valueChanged(int value);

    void on_image_contrast_valueChanged(int arg1);

    void change();//转变窗口槽函数

    void on_angle_value_slider_valueChanged(int value);

    void on_angle_value_valueChanged(int arg1);

private:
    Ui::TucamWidget *ui;

    CameraManager *cameraManager = CameraManager::GetInstance();


    bool initializeCamera();  // 初始化摄像头


    CameraWorker *cameraWorker;        //接收图像数据子线程
    QThread *cameraThread;


    QRect rect;                       //计算预览画面widget大小
    int displayWidth ;
    int displayHeight;

    bool if_inital =false;

    QList<double> stepValues; // 存储实际步长对应的值

    QTimer *refreshTemperature;
    QTimer *refreshExposureTime;

    QButtonGroup *buttonGroup;      // 用于管理ROI单选按钮组

    QPixmap pixmap;             //打开图片编辑
    QImage invertImageColors(const QImage &inputImage);//颜色翻转函数
    //裁剪
    QPixmap m_originalPixmap;   //保存原始在picture上的图片
    bool m_isMousePress = false; //定义鼠标最开始没有在picture中被按压
    bool m_isCropMode = false; // 裁剪模式标志
    QPoint m_beginPoint, m_endPoint;//点击的位置，基于picture中的坐标
    QImage              originalimage;   //保存原始图片
    open    o;    //子窗口


 public:

    TUCAM_INIT           m_itApi;       // SDK 初始化对象
    TUCAM_OPEN           m_opCam;       // 打开摄像头对象
    TUCAM_FRAME          m_frame;      // 帧对象
    TUCAM_FRAME          capframe;
    TUCAM_DRAW_INIT      drawInit;     //初始化绘图参数（预览）
    //TUCAM_VALUE_INFO     m_viCam;      //相机参数

    int                 m_nPID;         //相机pid
    int				    m_uSec;			// 秒钟
    int				    m_uMs;			// 毫秒
    int				    m_uUs;			// 微秒

    int                 m_nMidTTemp;    // 温度换算值
    HWND                  hwnd;       //获取控件id
    bool                m_ExpSpinboxChange; //曝光spin更新
    bool                m_ExpliderChange;//曝光slider更新

    TUCAM_DRAW          drawing;        //预览绘画对象
    TUCAM_ROI_ATTR      roi;            //ROI对象


};
#endif // TUCAMWIDGET_H
